/**
 * @file FsmState.h
 * @author lhc (liuhc_lhc@163.com)
 * @brief 
 * @version 0.2
 * @date 2024-05-31
 * 
 * @copyright Copyright (c) 2024
 * 
 * @par Change History
 *  Date        Version     Author    Description
 *  ----------  ----------  -------   -----------------------------
 *  2024-05-31  0.1         lhc       初始版本
 *  2024-05-31  0.2         lhc       添加FsmProcessEvents函数,简化应用层函数代码实现
*/
#ifndef __FSM_STATE_H__
#define __FSM_STATE_H__

#include "const.h" //存放事件枚举
// #define INCLUDE_FIFO

/**
 * @brief 状态动作切换信息
 *
 */
typedef struct
{
    ENUM_STATE_T enCurState;     // 当前状态
    ENUM_EVENT_T enEventId;      // 事件ID
    ENUM_STATE_T enNextState;    // 当前状态+事件id后的状态
    VoidUint8FuncPtr pStateFunc; // 具体表现
} STR_STATE_INFO;

/**
 * @brief 当前状态结构体
 *
 */
typedef struct
{
    const STR_STATE_INFO *pStateTable; // 找到当前状态信息
    ENUM_STATE_T enCurState;           // 当前状态
    uint16_t usStateNum;               // 总事件数量
    uint16_t ucMax;                    // 最大状态数量
} STR_STATE_MACHINE;


extern void FsmInit(STR_STATE_MACHINE *pSM, STR_STATE_INFO *pStateTable,
                    const uint8_t ucMax, const ENUM_STATE_T enEvt);
extern bool FsmStateAdd(STR_STATE_MACHINE *pStateBuf, ENUM_STATE_T enCurState,
                     ENUM_EVENT_T enEventId, ENUM_STATE_T enNextState, VoidUint8FuncPtr pAction);
extern void FsmMachineRun(STR_STATE_MACHINE *pSM, const ENUM_EVENT_T enEvt);

#if INCLUDE_FIFO
void FsmProcessEvents(STR_STATE_MACHINE* pSM, void* pFifo,
                      uint8_t maxCount)
#else 
void FsmProcessEvents(STR_STATE_MACHINE* pSM, void* pFifo,
                      FsmGetEventFunc getEventFunc, uint8_t maxCount);
#endif

#endif
